# 按时间戳进行每一步的模拟。


from SAGIN_Progrem.entity.Appliances import Appliances
from SAGIN_Progrem.entity.UAV import UAV
from SAGIN_Progrem.entity.Satellite import Satellite
from SAGIN_Progrem.entity.Cloud import Cloud
import random
import math


class Simulation():

    # def __init__(self):


    # 第二步：确定无人机的轨迹，确保五架无人机在飞行过程中能给更多的传感器提供服务.同时判断无人机的覆盖范围内的传感器
    def trajectories(self, app_list, uav_list):
        cover_list = []  # 无人机覆盖传感器集合
        for i in range(0, 5):
            theta = random.randrange(0, 360)  # 飞行角度目前随机
            new_coordinates = uav_list[i].reset_coordinates_x_y(theta)
            cover_list.append(uav_list[i].cover(app_list))
            # 确保每个无人机的覆盖范围不重叠   重叠就扣分
            if ((math.sqrt(math.pow((new_coordinates[0] - uav_list[(i + 1) % 5].coordinates_x_y[0]), 2) + math.pow(
                    (new_coordinates[1] - uav_list[(i + 1) % 5].coordinates_x_y[0]), 2))) >= 100 and
                    (math.sqrt(math.pow((new_coordinates[0] - uav_list[(i + 2) % 5].coordinates_x_y[0]), 2) + math.pow(
                        (new_coordinates[1] - uav_list[(i + 2) % 5].coordinates_x_y[0]), 2))) >= 100 and
                    (math.sqrt(math.pow((new_coordinates[0] - uav_list[(i + 3) % 5].coordinates_x_y[0]), 2) + math.pow(
                        (new_coordinates[1] - uav_list[(i + 3) % 5].coordinates_x_y[0]), 2))) >= 100 and
                    (math.sqrt(math.pow((new_coordinates[0] - uav_list[(i + 4) % 5].coordinates_x_y[0]), 2) + math.pow(
                        (new_coordinates[1] - uav_list[(i + 4) % 5].coordinates_x_y[0]),
                        2))) >= 200):  # 50代表两个无人机的直线距离最小值，等于两个无人机的覆盖半径之和
                uav_list[i].coordinates_x_y = new_coordinates  # 符合要求更新无人机的坐标
                continue
            elif (new_coordinates[0] > 1000 or new_coordinates[1] > 1000):  # 无人机的坐标不能超过测试范围(目前的范围是1000*1000)
                i = i - 1  # 超出限制，本轮重新执行
            else:
                i = i - 1
        return uav_list, cover_list

if __name__ == '__main__':
    # 第一步：把所有的设备进行初始化，生成100个地面设备、5个无人机、一个卫星、一个云服务器。
    app_list = []   # 所有传感器的集合
    uav_list = []   # 所有无人机的集合
    for i in range(0, 1000): # 1000个传感器
        app_list.append(Appliances(i))

    for i in range(0, 5): # 5个无人机
        uav_list.append(UAV(i))

    sate = Satellite() # 卫星
    cloud = Cloud() # 云服务器
    # for i in range(0,5):
    #     print(uav_list[i].coordinates_x_y)

    # 第二步：确定无人机的轨迹，确保五架无人机在飞行过程中能给更多的传感器提供服务.同时判断无人机的覆盖范围内的传感器

    simutation = Simulation()
    uav_list, cover_list = simutation.trajectories(app_list, uav_list)
    print(uav_list[0].id)
    print(cover_list)
    cover_num = 0
    for i in range(0, len(cover_list)):
        cover_num += len(cover_list[i])
    print(cover_num)
    # 第三步：每隔一个时间戳，传感器生成任务，无人机和卫星收集任务，并对其进行计算和卸载处理，云处理卫星卸载的任务。

    for i in range(0, len(cover_list)):

        for j in range(0, len(cover_list[i])):

            uav_list[i].collect(app_list[cover_list[i][j]].task_app_one_list)

    print(uav_list[0].computing_queue.size())






